package com.atguigu.activity;

import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**1.关联业务id
 * 2.流程实例的挂起状态
 * 用户就不能再处理了
 * 某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除，流程暂停后将不会执行；
 */
@SpringBootTest
public class ActivityTest1 {
    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private HistoryService historyService;

    /**
     * 启动流程实例，添加businessKey
     * 举例：请假流程启动一个流程实例，就可以将请假单的id作为业务标识存储到activiti中，
     * 将来查询activiti的流程实例信息就可以获取请假单的id从而关联查询业务系统数据库
     * 得到请假单信息
     */
    @Test
    public void startUpProcessAddBusinessKey(){
        String busyKey="1";
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qingjia", busyKey);
        //输出
        System.out.println("业务id:"+processInstance.getBusinessKey());
        System.out.println("实例id:"+processInstance.getProcessInstanceId());
    }

    /**
     *暂停流程定义部署：
     * 操作流程定义为挂起状态，该流程定义下面的所有流程实例全部暂停:
     * 流程定义为挂起状态，该流程定义将不允许启动新的流程实例，同时该流程定义下所有的流程实例将全部挂起暂停执行
     */
    @Test
    public void suspendProcessInstance() {
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("qingjia").singleResult();
        //获取状态，如果是暂停，把它激活，如果是激活，把它暂停
        boolean suspended = processDefinition.isSuspended();
        if (suspended){
            //三个参数必填参数1:流程定义的id  参数2:是否激活    参数3:时间点
            repositoryService.activateProcessDefinitionById(processDefinition.getId(),true,null);
            System.out.println("被激活了");
        }else{
            //三个参数必填参数1:流程定义的id  参数2:是否激活    参数3:时间点
            repositoryService.suspendProcessDefinitionById(processDefinition.getId(),true,null);
            System.out.println("被挂起了");
        }
    }

    /**
     * 暂停具体的流程实例
     * 操作流程实例对象，针对单个流程执行挂起操作，
     * 某个流程实例挂起则此流程不在继续执行，完成该流程实例的当前任务将报异常；
     */
    @Test
    public void SingleSuspendProcessInstance(){
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("9c95f1de-b2d3-11ee-a6d2-005056c00001").singleResult();
        boolean suspended = processInstance.isSuspended();
        if (suspended){
            //当前为暂停，把它变为激活
            runtimeService.activateProcessInstanceById(processInstance.getId());
            System.out.println("激活了");
        }else{
            //当前为激活，把它变为挂起
            runtimeService.suspendProcessInstanceById(processInstance.getId());
            System.out.println("暂停了");
        }
    }
    @Test
    public void completeTak() {
        Task singleResult = taskService.createTaskQuery().taskAssignee("lisi").singleResult();
        taskService.complete(singleResult.getId());
    }
}
